﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FabrikatorDB;

namespace Fabrikator
{
    public class Bono
    {
        public Bono() { }
        //}
        //BONO TALİMAT SAYISI : 20
        //BONO LİMİTİ = SERVETİ * 10
        //
        public decimal[] BonoYeterlilikKontrol(int UyeNo)
        {
            decimal[] Yeterlilik = new decimal[] { 0, 0 };
            //İlk Kontrol Adet olarak
            using (FabriDataContext db = new FabriDataContext())
            {
                //0 Pasif, 1 Yayında, 2 Alınan, 3 Bitiş
                var bonolar = from bono in db.BonoTalimats where bono.UyeNo == UyeNo && (bono.Durum == 1 || bono.Durum == 2) select bono;
                decimal mevcutbonosu = bonolar.Count();
                decimal BonoLimit = 20;
                // Bono Limit olarak 20 belirlendi.
                Yeterlilik[0] = BonoLimit - mevcutbonosu;
                // İkinci Kontrol Servet *10 olarakea
                decimal uyeservet = 100000;//sqlden alınacak bilgi
                decimal ServetLimit = 10 * uyeservet;
                decimal uyebonotutar = bonolar.Sum(n => n.Nominal).Value;
                Yeterlilik[1] = ServetLimit - uyebonotutar;
            }
            return Yeterlilik;

        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="Tutar"></param>
        /// <param name="Vade"></param>
        /// <param name="Faiz"></param>
        /// <returns>Nominal-Vade-Faiz-Maliyet-Piyasa-Getiri</returns>
        public decimal[] BonoHazirla(decimal Tutar, int Vade, decimal Faiz)
        {
            decimal[] sonuc = new decimal[] { 100000, 24, 1.25m, 3533.37m, 96466.63m, 10 };
            decimal NominalDeger = Tutar;
            decimal Vadesi = Vade;
            decimal FaizOrani = Faiz;
            decimal PiyasaDegeri = BonoPiyasaDegeri(Tutar, Vade, Faiz);
            string Duzeltme = string.Format("{0:#,0.00}", PiyasaDegeri);
            PiyasaDegeri = Convert.ToDecimal(Duzeltme);
            decimal BonoMaliyet = NominalDeger - PiyasaDegeri;
            Duzeltme = string.Format("{0:#,0.00}", BonoMaliyet);
            BonoMaliyet = Convert.ToDecimal(Duzeltme);
            decimal BonoGetiri = BonoMaliyet / Vadesi;
            Duzeltme = string.Format("{0:#,0.00}", BonoGetiri);
            BonoGetiri = Convert.ToDecimal(Duzeltme);
            sonuc[0] = NominalDeger;
            sonuc[1] = Vadesi;
            sonuc[2] = FaizOrani;
            sonuc[3] = BonoMaliyet;
            sonuc[4] = PiyasaDegeri;
            sonuc[5] = BonoGetiri;
            return sonuc;
        }
        //public decimal BonoFaizKontrol(decimal Oran) { 

        //}
        public string BonoHazirlaString(int Tutar, int VadeSaat, decimal FaizOrani)
        {
            string sonuc = string.Empty;
            decimal NominalDeger = Tutar;
            int Vade = VadeSaat;
            decimal Faiz = FaizOrani;
            decimal PiyasaDegeri = BonoPiyasaDegeri(Tutar, VadeSaat, FaizOrani);
            decimal BonoMaliyeti = NominalDeger - PiyasaDegeri;
            string faizduzelt = string.Format("{0:#,0.00}", Faiz);
            sonuc = "Vadesi: " + VadeSaat + " saat, " +
                " Faiz Oranı %o (Binde): " + faizduzelt + " , " +
                " Nominal Değeri: " + NominalDeger + " TL olarak hazırladığınız bonunuzun " +
                " ihracı gerçekleşmesi halinde " +
                " belirlediğiniz kriterlere göre oluşan " + BonoMaliyeti + " TL maliyet düşülerek" +
                " Piyasa Değeri: " + PiyasaDegeri + " TL olarak belirlenen tutar Nakit hesabınıza aktarılacaktır.";
            return sonuc;
        }
        public DateTime BonoTarihiHesapla(int VadeSaat)
        {
            int vadesayisi = 0;
            vadesayisi = VadeSaat;
            DateTime vadetarihi = DateTime.Now;
            for (int i = 0; i < vadesayisi; i++)
            {
                vadetarihi = vadetarihi.AddHours(1);
            }
            return vadetarihi;
        }
        public decimal BonoPiyasaDegeri(decimal Tutar, int VadeSaat, decimal FaizOrani)
        {
            decimal NominalDegeri = 0;
            NominalDegeri = Tutar;
            decimal PiyasaDegeri = 0;
            decimal Oran = (FaizOrani / 100);
            decimal ToplamOran = 1;
            for (int i = 0; i < VadeSaat; i++)
            {
                ToplamOran = ToplamOran * (1 + ((Oran) / 10));
            }
            PiyasaDegeri = NominalDegeri / ToplamOran;
            string duzeltme = string.Format("{0:#,0.00}", PiyasaDegeri);
            PiyasaDegeri = Convert.ToDecimal(duzeltme);
            return PiyasaDegeri;
        }
        public decimal BonoPiyasaDegeri2(int Tutar, int VadeSaat, decimal FaizOrani)
        {
            decimal NominalDegeri = 0;
            NominalDegeri = Tutar;
            decimal PiyasaDegeri = 0;
            decimal Oran = (FaizOrani / 100);
            decimal ToplamOran = 1;
            for (int i = 0; i < VadeSaat; i++)
            {
                ToplamOran = ToplamOran * (1 + ((Oran) / 10));
            }
            PiyasaDegeri = NominalDegeri * ToplamOran;
            string duzeltme = string.Format("{0:#,0.00}", PiyasaDegeri);
            PiyasaDegeri = Convert.ToDecimal(duzeltme);
            return PiyasaDegeri;
        }
        public int BonoTalimatiVer(int UyeNo, decimal Tutar, int Vade, decimal Faiz)
        {
            int Sonuc = 0;
            decimal[] Yeterlilik = BonoYeterlilikKontrol(UyeNo);
            if (Yeterlilik[0] <= 0)
            {
                Sonuc = 1;
            }
            else if (Yeterlilik[1] < Tutar)
            {
                Sonuc = 2;
            }
            else
            {
                decimal[] VerilecekBono = BonoHazirla(Tutar, Vade, Faiz);
                try
                {
                    using (FabriDataContext db = new FabriDataContext())
                    {
                        BonoTalimat yenitalimat = new BonoTalimat();
                        yenitalimat.Nominal = VerilecekBono[0];
                        yenitalimat.Vade = Convert.ToInt32(VerilecekBono[1]);
                        yenitalimat.Faiz = VerilecekBono[2];
                        yenitalimat.Maliyet = VerilecekBono[3];
                        yenitalimat.Piyasa = VerilecekBono[4];
                        yenitalimat.BirimGetiri = VerilecekBono[5];
                        yenitalimat.Durum = 1;
                        yenitalimat.UyeNo = UyeNo;
                        yenitalimat.Tarih = DateTime.Now;
                        db.BonoTalimats.InsertOnSubmit(yenitalimat);
                        db.SubmitChanges();
                        Sonuc = 3;
                    }
                }
                catch (Exception)
                {

                    Sonuc = 0;
                }
            }
            return Sonuc;
        }
        public string BonoSatinAlPro(int AlanUye, int TalimatNo)
        {
            string sonuc = string.Empty;
            int? donen = 0;
            using (FabriDataContext db = new FabriDataContext())
            {
                db.BonoSatinAl(AlanUye, TalimatNo, ref donen);
            }
            return sonuc;
        }
        public int BonoSatinAl(int AlanUyeNo, int TalimatNo)
        {
            int Sonuc = 0;
            using (FabriDataContext db = new FabriDataContext())
            {

                var talimatibul = (from talimat in db.BonoTalimats where talimat.BonoTalimatNo == TalimatNo && talimat.Durum == 1 select talimat).FirstOrDefault();
                //Hesap Kontrol
                var kontrol = (from hes in db.NakitHes where hes.UyeNo == AlanUyeNo select hes).FirstOrDefault();
                //Yeterli para varsa
                if (talimatibul.Piyasa < kontrol.Miktar && talimatibul.UyeNo != AlanUyeNo)
                {
                    //Satın alma işlemi gerçekleşir..
                    decimal PiyasaDegeri = Convert.ToDecimal(talimatibul.Piyasa);
                    talimatibul.UyeNoAlan = AlanUyeNo;
                    talimatibul.Durum = 2;
                    talimatibul.VadeTarih = BonoTarihiHesapla(Convert.ToInt32(talimatibul.Vade));
                    //Alan kişinin hesabından para düşülür.
                    decimal Mevcut = Convert.ToDecimal(kontrol.Miktar) - PiyasaDegeri;
                    kontrol.Miktar = Mevcut;
                    db.SubmitChanges();
                    //Bonoyu ihraç eden kişinin hesabına para yatar
                    BonoParaEkle(Convert.ToInt32(talimatibul.UyeNo), PiyasaDegeri);
                    //Bonolar yenibono = new Bonolar();
                    //yenibono.BonoTalimatNo = talimatibul.BonoTalimatNo;
                    //yenibono.UyeNoSatan = talimatibul.UyeNo;
                    //yenibono.UyeNoAlan = AlanUyeNo;
                    //yenibono.Tarih = BonoTarihiHesapla(Convert.ToInt32(talimatibul.Vade));
                    //db.Bonolars.InsertOnSubmit(yenibono);
                    //db.SubmitChanges();
                }


            }
            return Sonuc;
        }
        public int BonoTalimatiIptal(int TalimatNo, int UyeNo)
        {
            int Sonuc = 0;
            try
            {
                using (FabriDataContext db = new FabriDataContext())
                {
                    var iptaltalimat = (from talim in db.BonoTalimats where talim.BonoTalimatNo == TalimatNo && talim.UyeNo == UyeNo select talim).FirstOrDefault();
                    iptaltalimat.Durum = 0;
                    db.SubmitChanges();
                    Sonuc = 4;
                }
            }
            catch (Exception)
            {
                Sonuc = 0;
            }
            return Sonuc;
        }
        public List<BonoTalimat> BonoTalimatListele(int UyeNo, int BonoDurumu)
        {
            List<BonoTalimat> talimatlar = new List<BonoTalimat>();
            using (FabriDataContext db = new FabriDataContext())
            {
                //0 Pasifler, 1 Aktif Talimat, 2 Bono Olmuş, 3 Satışı Bitmiş
                var uyetalimatlari = from talimat in db.BonoTalimats where talimat.UyeNo == UyeNo && talimat.Durum == BonoDurumu select talimat;
                foreach (BonoTalimat item in uyetalimatlari)
                {
                    talimatlar.Add(item);
                }
            }
            return talimatlar;
        }
        public List<BonoTalimat> BonoAlinanListele(int UyeNo, int BonoDurumu)
        {
            List<BonoTalimat> talimatlar = new List<BonoTalimat>();
            using (FabriDataContext db = new FabriDataContext())
            {
                //0 Pasifler, 1 Aktif Talimat, 2 Bono Olmuş, 3 Satışı Bitmiş
                var uyetalimatlari = from talimat in db.BonoTalimats where talimat.UyeNoAlan == UyeNo && talimat.Durum == BonoDurumu select talimat;
                foreach (BonoTalimat item in uyetalimatlari)
                {
                    talimatlar.Add(item);
                }
            }
            return talimatlar;
        }
        public string BonoTalimatSonuc(int Deger)
        {
            string Sonuc = string.Empty;
            if (Deger == 0)
            {
                Sonuc = "Beklenmeyen bir hata oluştu.";
            }
            else if (Deger == 1)
            {
                Sonuc = "Talimat verme limitinizi aştınız!";
            }
            else if (Deger == 2)
            {
                Sonuc = "Girdiğiniz tutar; Servetinize göre çok yüksek bir tutar veya daha önceki bonolarınız sonucu kalan limitinizin üstünde bir tutardır.";
            }
            else if (Deger == 3)
            {
                Sonuc = "Talimatınız başarıyla kayıt edildi.";
            }
            else if (Deger == 4)
            {
                Sonuc = "Talimatınız başarıyla iptal edildi.";
            }
            else
            {
                Sonuc = "Beklenmeyen bir hata oluştu.";
            }
            return Sonuc;
        }
        //public int BonoParaTransfer()
        public int BonoParaEkle(int UyeNo, decimal Miktar)
        {
            int Sonuc = 0;
            try
            {
                using (FabriDataContext db = new FabriDataContext())
                {
                    var uyehesabi = (from uye in db.NakitHes where uye.UyeNo == UyeNo select uye).FirstOrDefault();
                    decimal mevcut = Convert.ToDecimal(uyehesabi.Miktar);
                    uyehesabi.Miktar = mevcut + Miktar;
                    db.SubmitChanges();
                    Sonuc = 1;
                }
            }
            catch (Exception)
            {
                Sonuc = 0;
            }
            return Sonuc;
        }
        public int BonoParaCikar(int UyeNo, decimal Miktar)
        {
            int Sonuc = 0;
            try
            {
                using (FabriDataContext db = new FabriDataContext())
                {
                    var uyehesabi = (from uye in db.NakitHes where uye.UyeNo == UyeNo select uye).FirstOrDefault();
                    decimal mevcut = Convert.ToDecimal(uyehesabi.Miktar);
                    uyehesabi.Miktar = mevcut - Miktar;
                    db.SubmitChanges();
                    Sonuc = 1;
                }
            }
            catch (Exception)
            {
                Sonuc = 0;
            }
            return Sonuc;
        }
        public List<BonoTalimat> BonoZamaniGelmis(DateTime Tarih)
        {
            List<BonoTalimat> Bonolar = new List<BonoTalimat>();
            using (FabriDataContext db = new FabriDataContext())
            {
                var zamanigelen = from bono in db.BonoTalimats where bono.VadeTarih < Tarih && bono.Durum == 2 select bono;

            }



            return Bonolar;
        }
        public class BonoTalimatBirlestir
        {

        }
        //static class IEnumerableExtensions
        //{

        //    public static T PickRandomOne<T>(this IEnumerable<T> list, Random rnd)
        //    {
        //        T picked = default(T);
        //        int cnt = 0;
        //        foreach (T item in list)
        //        {
        //            if (rnd.Next(++cnt) == 0)
        //            {
        //                picked = item;
        //            }
        //        }
        //        return picked;
        //    }

        //}
    }
}
